package com.shujia.wyh.day28;

/*
    反射：通过一个Class文件对象去使用或者修改文件对象中的成员变量，构造方法，成员方法（无论是否私有，都能获取并使用）

    我们在使用成员之前，得先有一个java文件，然后在实例化的时候，new一下就完事了。
    Person p = new Person();
    p.eat("汉堡");

    总归来说，无论是调用什么成员，都是有个对象，归根结底，对象是根据类来的，实际上底层是依赖一个class文件
    对于java程序来说，依赖的是这个class文件对应的Class文件对象。

    class类：
        成员变量：Field
        构造方法：Constructor
        成员方法：Method

   如何获取一个类对应的Class文件对象呢？


 */
public class ReflexDemo1 {
    public static void main(String[] args) {
        //方式1：通过Object类中的getClass()方法，返回此Object类的运行时的类
        Person person = new Person();
        Class<? extends Person> c1 = person.getClass();
        Person person1 = new Person();
        Class<? extends Person> c2 = person1.getClass();
        System.out.println(c1==c2);

        //方式2：在不new的前提下，获取该类的class文件对象，java中每一个类都有一个静态的属性class
        Class<Person> c3 = Person.class;
        System.out.println(c1==c3);
        System.out.println(c2==c3);

        //方式3：Class类中有一个静态的方法，获取该类的class文件对象 (最常用的)
        //static Class<?> forName(String className)
        //返回与给定字符串名称的类或接口相关联的 类对象。
        try {
            Class<?> c4 = Class.forName("com.shujia.wyh.day28.Person");
            System.out.println(c1==c4);
            System.out.println(c2==c4);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


    }
}
